<template>
	<t-table-column v-bind="$attrs">
		<!-- 判断slots是否为一个函数，如果是则使用tiny-render渲染进默认插槽中 -->
		<template v-if="isFunction(slots)" v-slot:default="scope">
			<tiny-render :template="slots" :params="[scope.row, scope.column, scope.$index, scope]"></tiny-render>
		</template>
		<!-- 判断slots是否为对象，如果是，并且对象中default也是函数，则渲染进默认插槽中 -->
		<template v-else-if="isFunction(get(slots, 'default', null))" v-slot:default="scope">
			<tiny-render :template="slots.default" :params="[scope.row, scope.column, scope.$index, scope]"></tiny-render>
		</template>
		<!-- 判断slots是否为对象，如果是，并且对象中header也是函数，则渲染进表头插槽中 -->
		<template v-if="isFunction(get(slots, 'header', null))" v-slot:header="scope">
			<tiny-render :template="slots.header" :params="[scope.column, scope.$index]"></tiny-render>
		</template>
		<template v-if="Array.isArray(children) && children.length">
			<tiny-table-column v-for="(column, index) in children" :key="index" v-bind="column" />
		</template>
	</t-table-column>
</template>

<script>
import TinyTableColumn from './TinyTableColumn'
import TinyRender from './TinyRender'

export default {
	name: "TinyTableColumn",
	components: {
		TinyTableColumn,
		TinyRender
	},
	props: {
		/**
		 * @description 表格列插槽
		 * @type {Function|Object}
		 */
		slots: {
			type: [Function, Object],
			default: null
		},
		/**
		 * @description 表格列数据
		 * @type {Array}
		 */
		children: {
			type: Array,
			default: () => []
		}
	},
	methods: {
		/**
		 * @description 判断是否是函数
		 * @param {Function} fn
		 * @returns {Boolean}
		 */
		isFunction(fn) {
			return Object.prototype.toString.call(fn) === '[object Function]';
		},
		/**
		 * @description 获取对象的属性
		 * @param {Object} object
		 * @param {String} path
		 * @param {Any} defaultValue
		 * @returns {Any}
		 */
		get(object, path, defaultValue) {
			// 判断Object是否为Object类型
			if(Object.prototype.toString.call(object) !== '[object Object]') {
				return defaultValue;
			}

			const pathArray = Array.isArray(path) ? path : path.match(/([^[.\]])+/g);
			return pathArray.reduce((acc, key) => acc && acc[key], object) || defaultValue;
		}
	}
}
</script>